package cn.iocoder.yudao.module.lowcode.core.util;

import java.util.HashMap;
import java.util.Map;

/**
 * Magic API 数据类型映射工具类
 *
 * @author 芋道源码
 */
public class MagicApiDataTypeUtil {

    /**
     * 数据库类型到 Magic API 数据类型映射
     */
    public static final Map<String, String> TYPE_MAPPING = new HashMap<>();

    static {
        // 整数类型
        TYPE_MAPPING.put("TINYINT", "Integer");
        TYPE_MAPPING.put("SMALLINT", "Integer");
        TYPE_MAPPING.put("MEDIUMINT", "Integer");
        TYPE_MAPPING.put("INT", "Integer");
        TYPE_MAPPING.put("INTEGER", "Integer");
        TYPE_MAPPING.put("BIGINT", "Long");
        
        // 浮点类型
        TYPE_MAPPING.put("FLOAT", "Float");
        TYPE_MAPPING.put("DOUBLE", "Double");
        TYPE_MAPPING.put("DECIMAL", "BigDecimal");
        TYPE_MAPPING.put("NUMERIC", "BigDecimal");
        
        // 日期时间类型
        TYPE_MAPPING.put("DATE", "Date");
        TYPE_MAPPING.put("DATETIME", "Date");
        TYPE_MAPPING.put("TIMESTAMP", "Date");
        TYPE_MAPPING.put("TIME", "Date");
        TYPE_MAPPING.put("YEAR", "Date");
        
        // 字符串类型
        TYPE_MAPPING.put("CHAR", "String");
        TYPE_MAPPING.put("VARCHAR", "String");
        TYPE_MAPPING.put("TINYTEXT", "String");
        TYPE_MAPPING.put("TEXT", "String");
        TYPE_MAPPING.put("MEDIUMTEXT", "String");
        TYPE_MAPPING.put("LONGTEXT", "String");
        TYPE_MAPPING.put("ENUM", "String");
        TYPE_MAPPING.put("SET", "String");
        
        // 二进制类型
        TYPE_MAPPING.put("BINARY", "Byte");
        TYPE_MAPPING.put("VARBINARY", "Byte");
        TYPE_MAPPING.put("TINYBLOB", "Byte");
        TYPE_MAPPING.put("BLOB", "Byte");
        TYPE_MAPPING.put("MEDIUMBLOB", "Byte");
        TYPE_MAPPING.put("LONGBLOB", "Byte");
        
        // 布尔类型
        TYPE_MAPPING.put("BIT", "Boolean");
        TYPE_MAPPING.put("BOOLEAN", "Boolean");
    }

    /**
     * 根据数据库类型获取 Magic API 数据类型
     *
     * @param dbType 数据库类型
     * @return Magic API 数据类型
     */
    public static String getMagicApiType(String dbType) {
        if (dbType == null) {
            return "String";
        }
        
        String upperType = dbType.toUpperCase();
        
        // 处理带长度的类型，如 VARCHAR(255)
        if (upperType.contains("(")) {
            upperType = upperType.substring(0, upperType.indexOf("("));
        }
        
        return TYPE_MAPPING.getOrDefault(upperType, "String");
    }

    /**
     * 判断是否为数值类型
     *
     * @param dbType 数据库类型
     * @return 是否为数值类型
     */
    public static boolean isNumberType(String dbType) {
        if (dbType == null) {
            return false;
        }
        
        String upperType = dbType.toUpperCase();
        if (upperType.contains("(")) {
            upperType = upperType.substring(0, upperType.indexOf("("));
        }
        
        return upperType.matches("(TINYINT|SMALLINT|MEDIUMINT|INT|INTEGER|BIGINT|FLOAT|DOUBLE|DECIMAL|NUMERIC|BIT)");
    }

    /**
     * 判断是否为日期类型
     *
     * @param dbType 数据库类型
     * @return 是否为日期类型
     */
    public static boolean isDateType(String dbType) {
        if (dbType == null) {
            return false;
        }
        
        String upperType = dbType.toUpperCase();
        if (upperType.contains("(")) {
            upperType = upperType.substring(0, upperType.indexOf("("));
        }
        
        return upperType.matches("(DATE|DATETIME|TIMESTAMP|TIME|YEAR)");
    }

    /**
     * 判断是否为字符串类型
     *
     * @param dbType 数据库类型
     * @return 是否为字符串类型
     */
    public static boolean isStringType(String dbType) {
        if (dbType == null) {
            return true;
        }
        
        String upperType = dbType.toUpperCase();
        if (upperType.contains("(")) {
            upperType = upperType.substring(0, upperType.indexOf("("));
        }
        
        return upperType.matches("(CHAR|VARCHAR|TINYTEXT|TEXT|MEDIUMTEXT|LONGTEXT|ENUM|SET)");
    }
}